跳到主要内容

串口与IIC排错

补充内容,配合主课阅读。

通信不通,先查线上的信号,再查数据的含义。两层混在一起,越改越难找。

UART先发固定文本​

TX接对方RX,两边共地,波特率和帧格式一致。字符6是0x36,直接发送数值6则是0x06,串口助手显示方式也要选对。

115200、8N1每字节占10位,理想上限是11520 byte/s。100字节至少约8.68 ms。算上格式化和等待,实际还会慢一些。

一次回调不是一条命令​

指定长度接收、空闲中断、DMA半满或全满,描述的都是接收进展,不自动等于业务消息结束。

先把字节存入缓冲,再按长度、分隔符或帧头解析。试着把一条命令分两次发送,再把两条连着发送;两种都能正确识别,才算边界处理清楚。

缓冲满了要有处理办法,接收错误也要恢复。主循环不能一直处理同一个未清除的命令。字符串指针的sizeof不是字符串长度。

IIC先看ACK​

空闲时SCL、SDA都应为高。若被拉低,先查接线、上拉和器件状态,再看软件是否结束了上一笔事务。

OLED的7位地址0x3C,在本课程HAL接口中左移一位传0x78;读写位由接口处理。地址后没有ACK,就先别查字库。

读多个字节时,中间字节通常ACK,最后一字节NACK再STOP。器件内部寄存器地址、存储地址和IIC设备地址是不同的东西。

换器件以后​

OLED与EEPROM都用IIC,但命令不同。EEPROM还要注意页边界和写入等待,不能直接把一次总线发送完成当成已经存好。

先低速调通,再提速。外部上拉电压要满足所有器件,开漏不代表可以随意接5 V。